module 0xbeef::VersionModule {
    use std::signer;
    use std::debug;

    // Enum with 127 variants, each carrying a u64 value.
    enum Versions has copy, drop, store {
        V0(u64),
        V1(u64),
        V2(u64),
        V3(u64),
        V4(u64),
        V5(u64),
        V6(u64),
        V7(u64),
        V8(u64),
        V9(u64),
        V10(u64),
        V11(u64),
        V12(u64),
        V13(u64),
        V14(u64),
        V15(u64),
        V16(u64),
        V17(u64),
        V18(u64),
        V19(u64),
        V20(u64),
        V21(u64),
        V22(u64),
        V23(u64),
        V24(u64),
        V25(u64),
        V26(u64),
        V27(u64),
        V28(u64),
        V29(u64),
        V30(u64),
        V31(u64),
        V32(u64),
        V33(u64),
        V34(u64),
        V35(u64),
        V36(u64),
        V37(u64),
        V38(u64),
        V39(u64),
        V40(u64),
        V41(u64),
        V42(u64),
        V43(u64),
        V44(u64),
        V45(u64),
        V46(u64),
        V47(u64),
        V48(u64),
        V49(u64),
        V50(u64),
        V51(u64),
        V52(u64),
        V53(u64),
        V54(u64),
        V55(u64),
        V56(u64),
        V57(u64),
        V58(u64),
        V59(u64),
        V60(u64),
        V61(u64),
        V62(u64),
        V63(u64),
        V64(u64),
        V65(u64),
        V66(u64),
        V67(u64),
        V68(u64),
        V69(u64),
        V70(u64),
        V71(u64),
        V72(u64),
        V73(u64),
        V74(u64),
        V75(u64),
        V76(u64),
        V77(u64),
        V78(u64),
        V79(u64),
        V80(u64),
        V81(u64),
        V82(u64),
        V83(u64),
        V84(u64),
        V85(u64),
        V86(u64),
        V87(u64),
        V88(u64),
        V89(u64),
        V90(u64),
        V91(u64),
        V92(u64),
        V93(u64),
        V94(u64),
        V95(u64),
        V96(u64),
        V97(u64),
        V98(u64),
        V99(u64),
        V100(u64),
        V101(u64),
        V102(u64),
        V103(u64),
        V104(u64),
        V105(u64),
        V106(u64),
        V107(u64),
        V108(u64),
        V109(u64),
        V110(u64),
        V111(u64),
        V112(u64),
        V113(u64),
        V114(u64),
        V115(u64),
        V116(u64),
        V117(u64),
        V118(u64),
        V119(u64),
        V120(u64),
        V121(u64),
        V122(u64),
        V123(u64),
        V124(u64),
        V125(u64),
        V126(u64),
    }

    // Resource that holds a version.
    struct VersionHolder has key, store {
        version: Versions,
    }

    /// Stores the provided version under the caller's account.
    public entry fun store_version(account: &signer) {
        let version = Versions::V1(1);

        // Store the version
        move_to(account, VersionHolder { version });
    }

    /// Retrieves the stored version from the given account.
    public entry fun get_version(account: &signer) acquires VersionHolder {
        let holder = borrow_global<VersionHolder>(signer::address_of(account));
        debug::print(&holder.version);
    }
}
